    # -*- coding: utf-8 -*-

from django.contrib.auth.models import User, Group
from django.db.models import Q
from venda.models import *
from estoque.models import *
from registro.models import Evento
from cliente.models import Telefone, Endereco
from financeiro.models import Cheque

import impressao.views

from django.shortcuts import render_to_response

# Para utilizar o MEDIA_URL devemos importar o seguinte
# e em seguida fazer:
# context_instance=RequestContext(request)
# depois de locals(),
from django.template import RequestContext

from datetime import datetime, timedelta, date
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.decorators import login_required, permission_required
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.cache import never_cache

from licenca.models import *
import licenca.views

@login_required
def venda(request):
    return HttpResponseRedirect('/venda/pedido/')

@login_required
@permission_required('venda.abrir_caixa')
def caixa_abrir(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        return HttpResponseRedirect('/venda/pedido/')
    else:
        if request.method == 'POST':
            try:
                valor = float(request.POST['valor'].strip().replace(',', '.'))
                guiche_id = int(request.POST['guiche'])
            except:
                request.session['aviso'] = 'Valor inválido'
                return HttpResponseRedirect('/venda/caixa/abrir/')
            
            if Caixa.objects.filter(guiche_id = guiche_id, fechado = None):
                request.session['aviso'] = 'Caixa já ocupado. Selecione outro.'
                return HttpResponseRedirect('/venda/caixa/abrir/')
            
            if valor < 0:
                request.session['aviso'] = 'Valores negativos não são permitidos'
                return HttpResponseRedirect('/venda/caixa/abrir/')
            
            guiche = Guiche.objects.get(id = guiche_id)
            caixa = Caixa(operador = request.user, guiche = guiche, valor_inicial = valor, aberto = datetime.now(), fechado = None, usuario = request.user)
            caixa.save()
            Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = 'Abriu caixa').save()
            return HttpResponseRedirect('/venda/pedido/')
        
        guiches = list(Guiche.objects.all())
        caixas_abertos = Caixa.objects.filter(fechado = None)
        for caixa in caixas_abertos:
            guiches.remove(caixa.guiche)
        
        mensagem = False
        aviso = False
        if request.session.has_key('mensagem'):
            mensagem = request.session['mensagem']
            del request.session['mensagem']
        if request.session.has_key('aviso'):
            aviso = request.session['aviso']
            del request.session['aviso']
        
        js = 'venda/caixa_abrir'
        return render_to_response(
            'venda/caixa_abrir.html', locals(),
            context_instance=RequestContext(request)
        )

@login_required
@permission_required('venda.alterar_caixa')
def caixa_encerrar(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        caixa = Caixa.objects.get(operador = request.user, fechado = None)
        
        if Pedido.objects.filter(caixa = caixa, total__gt = 0, fechado = None).count() > 0:
            request.session['aviso'] = 'Você deve finalizar todos os pedidos para encerrar o caixa'
            return HttpResponseRedirect('/venda/pedido/')
        elif Pedido.objects.filter(caixa = caixa, total = 0, fechado = None).count() > 0:
            pedidos = Pedido.objects.filter(caixa = caixa, total = 0, fechado = None)
            for pedido in pedidos:
                pedido.fechado = datetime.now()
                pedido.save()
            
            caixa.fechado = datetime.now()
            Evento(usuario = request.user, data = caixa.fechado, pedido = None, descricao = 'Encerrar caixa ' + str(caixa)).save()
            caixa.save()
            
            total_vendido = float(caixa.dinheiro + caixa.debito + caixa.cartao + caixa.cheque + caixa.crediario)
            total_em_especie = float(caixa.dinheiro) + float(caixa.recebimento) + float(caixa.valor_inicial) + float(caixa.valor_recebido) - float(caixa.valor_retirado)
            
            header = 'Apurado do dia'
            
            if caixa.guiche.impressora:
                c = ('Encerramento caixa %d - %s' % (caixa.guiche.numero, (caixa.operador.first_name + ' ' + caixa.operador.last_name))).center(caixa.guiche.impressora.colunas)
                r = ('Data: ' + datetime.now().strftime('%d/%m/%Y - %H:%M:%S')).center(caixa.guiche.impressora.colunas) 
                
                saida  = "Valor inicial".ljust(36) + " R$ " + ("%10.2f" % caixa.valor_inicial) + '\n'
                saida += impressao.views.linha(caixa.guiche.impressora.colunas) + '\n'
                saida += "Total em dinheiro".ljust(36) + " R$ " + ("%10.2f" % caixa.dinheiro) + '\n'
                saida += "Total em debito".ljust(36) + " R$ " + ("%10.2f" % caixa.debito) + '\n'
                saida += "Total em cartao (credito)".ljust(36) + " R$ " + ("%10.2f" % caixa.cartao) + '\n'
                saida += "Total em cheque".ljust(36) + " R$ " + ("%10.2f" % caixa.cheque) + '\n'
                saida += "Total em crediario".ljust(36) + " R$ " + ("%10.2f" % caixa.crediario) + '\n'
                saida += impressao.views.linha(caixa.guiche.impressora.colunas) + '\n'
                saida += "Total vendido no dia".ljust(36) + " R$ " + ("%10.2f" % total_vendido) + '\n'
                saida += impressao.views.linha(caixa.guiche.impressora.colunas) + '\n'
                saida += "Total em recebimento de contas".ljust(36) + " R$ " + ("%10.2f" % caixa.recebimento) + '\n'
                saida += impressao.views.linha(caixa.guiche.impressora.colunas) + '\n'
                saida += "Total em especie".ljust(36) + " R$ " + ("%10.2f" % total_em_especie) + '\n'
                
                impressao.views.imprime_caixa(
                    saida,
                    caixa.guiche.impressora,
                    c, r
                )
            
            return render_to_response(
                'venda/relatorio_caixa.html', locals(),
                context_instance=RequestContext(request)
            )
            
    else:
        return HttpResponseRedirect('/venda/caixa/abrir/')

@login_required
@permission_required('venda.novo_pedido')
def pedido(request):
    if not licenca.views.checar_licenca(request): return HttpResponseRedirect('/licenca/')
    
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        caixa = Caixa.objects.filter(operador = request.user, fechado = None)[0]
    else:
        return HttpResponseRedirect('/venda/caixa/abrir/')
    
    pedidos = Pedido.objects.filter(fechado = None, caixa = caixa)
    
    if pedidos.count() == 0:
        return HttpResponseRedirect('/venda/pedido/novo/')
    else:
        return HttpResponseRedirect('/venda/pedido/' + str(pedidos[0].id))

@login_required
@permission_required('venda.novo_pedido')
def pedido_id(request, pedido_id):
    if not licenca.views.checar_licenca(request): return HttpResponseRedirect('/licenca/')
    
    css = 'venda/pedido'
    js = 'venda/pedido'
    titulo = None
    header = 'Venda'
    
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        caixa = Caixa.objects.filter(operador = request.user, fechado = None)[0]
        
        pedidos = Pedido.objects.filter(id = pedido_id, fechado = None, caixa = caixa)
        if pedidos.count() == 1:
            pedido = pedidos[0]
            pedidos = Pedido.objects.filter(fechado = None, caixa = caixa)
            
            itens = Item.objects.filter(pedido = pedido)
            for item in itens:
                item.valor_total = item.quantidade * item.valor
            
            total = pedido.total
            
            #Calculando desconto
            if pedido.desconto != '0':
                total = (float(pedido.total) - float(pedido.desconto))
            
            titulo = pedido
            
            mensagem = False
            aviso = False
            if request.session.has_key('mensagem'):
                mensagem = request.session['mensagem']
                del request.session['mensagem']
            if request.session.has_key('aviso'):
                aviso = request.session['aviso']
                del request.session['aviso']
            
            return render_to_response(
                'venda/pedido.html', locals(),
                context_instance=RequestContext(request)
            )
        else:
            return HttpResponseRedirect('/venda/pedido/')
    else:
        return HttpResponseRedirect('/venda/pedido/')

@login_required
@permission_required('venda.novo_pedido')
def pedido_novo(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        caixa = Caixa.objects.filter(operador = request.user, fechado = None)[0]
        
        pedido = Pedido(caixa = caixa, total = 0, aberto = datetime.now(), fechado = None, desconto = '0')
        pedido.save()
        Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = 'Novo pedido').save()
        
        return HttpResponseRedirect('/venda/pedido/' + str(pedido.id))
    else:
        return HttpResponseRedirect('/venda/pedido/')

@login_required
@permission_required('venda.alterar_pedido')
def pedido_cancelar_id(request, pedido_id):
    css = 'venda/pedido'
    js = 'venda/pedido'
    titulo = None
    header = 'Venda'
    
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 1:
        caixa = Caixa.objects.filter(operador = request.user, fechado = None)[0]
        
        pedidos = Pedido.objects.filter(id = pedido_id, fechado = None, caixa = caixa)
        if pedidos.count() == 1:
            pedido = pedidos[0]
            
            itens = Item.objects.filter(pedido = pedido)
            for item in itens:
                if item.estado != 0:
                    item.produto.quantidade += item.quantidade
                    item.produto.quantidade_vendida -= item.quantidade
                    item.produto.save()
                    item.estado = 0
                    item.save()
                    Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = 'Item excluído por cancelamento de cupom').save()
            
            pedido.total = 0
            pedido.fechado = datetime.now()
            pedido.desconto = '0'
            pedido.save()
            Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = 'Cancelamento de cupom').save()
            
            request.session['mensagem'] = 'Cancelamento: \"' + unicode(pedido) + '\"'
            return HttpResponseRedirect('/venda/pedido/')
        else:
            return HttpResponseRedirect('/venda/pedido/')
    else:
        return HttpResponseRedirect('/venda/pedido/')

@csrf_exempt
@login_required
def adicionar_item_id(request):
    import re
    
    if request.POST.has_key('validar') and request.POST['validar'] == '1':
        pedido_id = int(request.POST['pedido_id'])
        quantidade = request.POST['quantidade']
        codigo = request.POST['codigo']
        
        try:
            produto = Produto.objects.get(codigo = codigo)
        except:
            request.session['aviso'] = 'Código de produto não encontrado'
            return HttpResponseRedirect('/venda/pedido/' + str(pedido_id))
            
        if re.match('(^([1-9]+\d*([.,]\d{1,3})?)|(^(0?[.,]\d{1,3})))$', quantidade):
            quantidade = float(quantidade.replace(',', '.'))
            
            if produto.unidade == 'Un' and int(quantidade) != quantidade:
                request.session['aviso'] = 'Quantidade deste produto deve ser valor inteiro'
                return HttpResponseRedirect('/venda/pedido/' + str(pedido_id))
            
            if quantidade > 0:
                pedido = Pedido.objects.get(id = pedido_id, fechado = None)
                
                if float(produto.quantidade) < float(quantidade):
                    request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
                    return HttpResponseRedirect('/venda/pedido/' + str(pedido_id))
                
                produto.quantidade = float(produto.quantidade) - float(quantidade)
                produto.quantidade_vendida = float(produto.quantidade_vendida) + float(quantidade)
                produto.save()
                
                item = Item(pedido_id = pedido_id, produto_id = produto.id, quantidade = quantidade, valor = produto.preco_de_venda, data = datetime.now())
                item.save()
                
                pedido.total = float(pedido.total) + (float(item.quantidade) * float(item.produto.preco_de_venda))
                pedido.save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u'Item adicionado por código').save()
                
                if int(item.quantidade) == 1:
                    request.session['mensagem'] = u"Item incluído."
                else:
                    request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
                    
            else:
                request.session['aviso'] = 'Quantidade inválida'
            
        else:
            request.session['aviso'] = 'Quantidade inválida'
        
        return HttpResponseRedirect('/venda/pedido/' + str(pedido_id))
    else:
        return HttpResponseRedirect('/')

@login_required
@permission_required('venda.delete_item')
def item_excluir(request, pedido_id, item_id):
    item = Item.objects.get(id = item_id)
    
    if item.estado != 0:
        item.estado = 0
        item.produto.quantidade += item.quantidade
        item.produto.quantidade_vendida -=  item.quantidade
        item.produto.save()
        
        item.pedido.total = float(item.pedido.total) - (float(item.produto.preco_de_venda) * float(item.quantidade) )
        item.pedido.save()
        item.save()
        
        Evento(usuario = request.user, data = datetime.now(), pedido = item.pedido, descricao = u"Removeu Item %d - %dx %s" % (item.id, item.quantidade, item)).save()
    
    return HttpResponseRedirect('/venda/pedido/' + pedido_id)

@login_required
def pedido_item_observacao(request):
    
    if request.is_ajax():
        
        if request.POST.has_key('item_id') and request.POST.has_key('observacao'):
    
            item_id = int(request.POST['item_id'])
            observacao = request.POST['observacao']
            
            if Item.objects.filter(id = item_id).count() > 0:
                item = Item.objects.get(id = item_id)
                item.observacao = observacao
                item.save()
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@login_required
def pedido_desconto(request):
    
    if request.is_ajax() and request.user.has_perm('venda.dar_desconto'):
        
        if request.POST.has_key('pedido_id') and request.POST.has_key('desconto'):
    
            pedido_id = int(request.POST['pedido_id'])
            desconto = request.POST['desconto']
            
            if Pedido.objects.filter(id = pedido_id).count() > 0:
                pedido = Pedido.objects.get(id = pedido_id)
                pedido.desconto = desconto
                pedido.save()
                Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Desconto " + desconto).save()
                
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@login_required
def pedido_valor_alterar(request):
    
    if request.is_ajax() and request.user.has_perm('venda.dar_desconto'):
        
        if request.POST.has_key('item_id') and request.POST.has_key('valor'):
    
            item_id = int(request.POST['item_id'])
            valor = request.POST['valor'].strip().replace(",", ".")
                
            if Item.objects.filter(id = item_id).count() > 0:
                try:
                    item = Item.objects.get(id = item_id)
                    
                    if valor == "":
                        valor = item.produto.preco_de_venda
                        
                    item.pedido.total = float(item.pedido.total) - float(item.valor)
                    item.valor = float(valor)
                    item.pedido.total = float(item.pedido.total) + float(item.valor)
                    
                    if item.valor >= 0:
                        item.save()
                        item.pedido.save()
                        Evento(usuario = request.user, data = datetime.now(), pedido = item.pedido, descricao = u"Alteração de valor " + valor).save()
                    else:
                        request.session['aviso'] = "Valor não pode ser negativo"
                except:
                    Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = u"Alteração de valor falhou!!!" + valor).save()
                    request.session['aviso'] = "Alteração de valor falhou"
                
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@login_required
#@permission_required('venda.delete_item')
def pedido_pagamento(request, pedido_id):
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        total = pedido.total
            
        #Calculando desconto
        if pedido.desconto != '0':
            total = (float(pedido.total) - float(pedido.desconto))
        
        pagamento_parcial = Pagamento_parcial.objects.filter(pedido = pedido_id, estado = 1)
        cheque = 0.0
        crediario = 0.0
        for pagamento in pagamento_parcial:
            if pagamento.tipo == 4:
                crediario += float(pagamento.valor)
            if pagamento.tipo == 3:
                cheque += float(pagamento.valor)
            
        valor_pago = 0.0
        for pagamento in pagamento_parcial:
            valor_pago += float(pagamento.valor)
        
        valor_final = float(total) - float(valor_pago)
        
        if valor_final < 0:
            troco = abs(valor_final)
        
        header = "Pagamento"
        css = "venda/pagamento"
        js = "venda/pagamento"
        
        mensagem = False
        aviso = False
        if request.session.has_key('mensagem'):
            mensagem = request.session['mensagem']
            del request.session['mensagem']
        if request.session.has_key('aviso'):
            aviso = request.session['aviso']
            del request.session['aviso']
        
        return render_to_response(
            'venda/pagamento.html', locals(),
            context_instance=RequestContext(request)
        )
        
    else:
        return HttpResponseRedirect('/venda/pedido/')

@login_required
#@permission_required('venda.delete_item')
@csrf_exempt
def pedido_pagamento_adicionar(request, pedido_id):
    
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if request.POST.has_key('valor') and request.POST.has_key('tipo') and request.POST['valor'] != '':
            valor = float(request.POST['valor'].strip().replace(',', '.'))
            tipo = int(request.POST['tipo'])
        else:
            request.session['aviso'] = 'Valor(es) incorreto(s)'
            return HttpResponseRedirect('/venda/pedido/pagamento/' + str(pedido.id))
        
        Pagamento_parcial(pedido = pedido, valor = valor, tipo = tipo, data = datetime.now()).save()
        Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Pagamento por tipo: " + str(tipo) + " valor: R$ " + str(valor)).save()
        
        return HttpResponseRedirect('/venda/pedido/pagamento/' + str(pedido.id))
        
    else:
        return HttpResponseRedirect('/venda/pedido/')

@login_required
#@permission_required('venda.delete_item')
def pedido_pagamento_excluir(request, pagamento_id):
    
    if Pagamento_parcial.objects.filter(id = pagamento_id).count() > 0:
        pagamento = Pagamento_parcial.objects.get(id = pagamento_id)
        
        request.session['aviso'] = u"Pagamento removido. Tipo: " + str(pagamento.tipo) + (" valor: R$ %.2f" % pagamento.valor).replace('.', ',')
        
        pagamento.estado = 0
        pagamento.save()
        Evento(usuario = request.user, data = datetime.now(), pedido = pagamento.pedido, descricao = u"Pagamento removido. Tipo: " + str(pagamento.tipo) + " valor: R$ " + str(pagamento.valor)).save()
        
        return HttpResponseRedirect('/venda/pedido/pagamento/' + str(pagamento.pedido.id))
        
    else:
        return HttpResponseRedirect('/venda/pedido/')

def tipo_pagamento(tipo):
    if tipo == 0:
        return 'dinheiro'
    elif tipo == 1:
        return 'debito'
    elif tipo == 2:
        return 'cartao (cred)'
    elif tipo == 3:
        return 'cheque'
    elif tipo == 4:
        return 'crediario'

@login_required
#@permission_required('venda.delete_item')
def pedido_finalizar(request, pedido_id):
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        # imprime
        if request.GET.has_key('imprime') and int(request.GET['imprime']) == 1:
            saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + (str(pedido.id).zfill(10) + ' - Caixa: '+ str(pedido.caixa.guiche.numero)).ljust(pedido.caixa.guiche.impressora.colunas) + '\n'
            saida += ('Operador: ' + pedido.caixa.operador.first_name + ' ' + pedido.caixa.operador.last_name).ljust(pedido.caixa.guiche.impressora.colunas) + '\n'
            saida += '-'* pedido.caixa.guiche.impressora.colunas + '\n'
            saida +=  "    Descricao                 Qt      Unit  Total\n"
            saida += '-'* pedido.caixa.guiche.impressora.colunas + '\n'
        
            itens = Item.objects.filter(pedido = pedido)
            i = 0
            for item in itens:
                i += 1
                if item.estado != 0:
                    saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(22) + ' ' + ("%3.3f" % item.quantidade).replace('.', ',').rjust(7) + item.produto.unidade.ljust(2) + ' ' + ("%.2f" % item.produto.preco_de_venda).replace('.', ',').rjust(6) +' ' + ("%.2f" % float(item.quantidade * item.produto.preco_de_venda)).replace('.', ',').rjust(6) + '\n'
            
            saida += '-'* pedido.caixa.guiche.impressora.colunas + '\n'
            
            saida += ("TOTAL R$ ").rjust(40) + ("%.2f" % pedido.total).replace('.', ',').rjust(10)
            total = float(pedido.total)
            # desconto
            if pedido.desconto != '0':
                pedido.desconto = float('%.2f' % float(pedido.desconto))
                total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
                
                saida += '\n'
                
                saida += ('Desconto R$ '.rjust(40)) + ('%.2f' % pedido.desconto).replace('.', ',').rjust(10) + '\n'
                
                saida += '-'* pedido.caixa.guiche.impressora.colunas + '\n'
                saida += ('VALOR FINAL R$ ').rjust(40) + ('%.2f' % (total)).replace('.', ',').rjust(10)
            
            #calculando valor pago
            saida += '\n'
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
            valor_pago = 0.0
            j = 0
            if len(pagamento_parcial) > 1:
                saida += '\n'
            for pagamento in pagamento_parcial:
                j += 1
                valor_pago += float(pagamento.valor)
                if len(pagamento_parcial) > 1:
                    saida += (('Pgto %.2d - ' % j) + tipo_pagamento(pagamento.tipo) + ' R$ ').rjust(40) + ('%.2f' % pagamento.valor).replace('.', ',').rjust(10) + '\n'
            
            if len(pagamento_parcial) > 1:
                saida += '\n'
                
            saida += ('Valor pago R$ '.rjust(40)) + ('%.2f' % valor_pago).replace('.', ',').rjust(10) + '\n'
            
            troco = abs(float(total) - float(valor_pago))
            saida += ('Troco R$ '.rjust(40)) + ('%.2f' % troco).replace('.', ',').rjust(10)
            
            impressao.views.imprime_caixa(
                saida,
                pedido.caixa.guiche.impressora
            )
            
            # fim impressão
        
        caixa = pedido.caixa
        
        dinheiro  = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1, tipo = 0)
        debito    = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1, tipo = 1)
        cartao    = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1, tipo = 2)
        cheque    = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1, tipo = 3)
        crediario = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1, tipo = 4)
        
        recebendo = 0.0
        for pagamento in dinheiro:
            caixa.dinheiro = float(caixa.dinheiro) + float(pagamento.valor)
            recebendo = float(recebendo) + float(pagamento.valor)
        
        for pagamento in debito:
            caixa.debito = float(caixa.debito) + float(pagamento.valor)
            recebendo = float(recebendo) + float(pagamento.valor)
            
        for pagamento in cartao:
            caixa.cartao = float(caixa.cartao) + float(pagamento.valor)
            recebendo = float(recebendo) + float(pagamento.valor)
            
        for pagamento in cheque:
            caixa.cheque = float(caixa.cheque) + float(pagamento.valor)
            recebendo = float(recebendo) + float(pagamento.valor)
            
        for pagamento in crediario:
            caixa.crediario = float(caixa.crediario) + float(pagamento.valor)
            recebendo = float(recebendo) + float(pagamento.valor)
        
        if Cheque.objects.filter(venda = pedido, concluido = None).count() > 0:
            caixa.cheque = float(caixa.cheque) - float(pagamento.valor)
        
        troco = float(pedido.total) - float(pedido.desconto) - float(recebendo)
        caixa.dinheiro = float(caixa.dinheiro) + troco
        
        pedido.fechado = datetime.now()
        pedido.save()
        caixa.save()
        
        return HttpResponseRedirect('/venda/pedido/')
    else:
        return HttpResponseRedirect('/venda/pedido/')
    
@login_required
@csrf_exempt
@permission_required('relatorio.view_report')
def relatorio(request):
    if Caixa.objects.all().count() == 0:
        request.session['aviso'] = "Nenhuma data encontrada"
        return HttpResponseRedirect('/')
    print "*" * 80
    # buscar datas iniciais e finais
    inicio = Caixa.objects.get(id=1).aberto
    fim = datetime.now()
    
    hoje = datetime.today()
    
    anos = range(inicio.year, fim.year + 1)
    anos.reverse()
    
    meses = {
        1: 'Janeiro',
        2: 'Fevereiro',
        3: 'Março',
        4: 'Abril',
        5: 'Maio',
        6: 'Junho',
        7: 'Julho',
        8: 'Agosto',
        9: 'Setembro',
        10: 'Outubro',
        11: 'Novembro',
        12: 'Dezembro'
    }
    
    days = range(1, 32)
    
    if request.POST.has_key('busca') and request.POST['busca'] == '1':
        dia = request.POST['dia']
        mes = request.POST['mes']
        ano = request.POST['ano']
        
        data = date(int(ano), int(mes), int(dia))
        
        dias = Caixa.objects.filter(Q(aberto__gt=data)&Q(aberto__lte=data+timedelta(1))).order_by('-id')
    else:
        dias = Caixa.objects.filter(aberto__gt = datetime.today() - timedelta(1) ).order_by('-id')
    
    return render_to_response('venda/relatorio.html',locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('relatorio.view_report')
def relatorio_dia(request, dia_id):
    dia = Caixa.objects.get(id=dia_id)
    
    total = 0.0
    desconto = 0.0
    valor_final = 0.0
    numero_pessoas = 0
    
    if dia.fechado == None:
        dia.fechado = datetime.now()
        pedidos_abertos = Pedido.objects.filter(aberto__gte = dia.aberto, fechado=None)
        
        for pedido in pedidos_abertos:
            pedido.valor_final = float(pedido.total)
            if pedido.desconto != '':
                pedido.valor_final -= float(pedido.desconto)
            else:
                pedido.desconto = 0
            
            total += float(pedido.total)
            desconto += float(pedido.desconto)
            valor_final += float(pedido.valor_final)
            
            pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
            pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    pedidos_fechados = Pedido.objects.filter(aberto__gte = dia.aberto, fechado__lt=dia.fechado)
    for pedido in pedidos_fechados:
        pedido.valor_final = float(pedido.total)
        if pedido.desconto != '':
            pedido.valor_final -= float(pedido.desconto)
        else:
            pedido.desconto = 0
        
        total += float(pedido.total)
        desconto += float(pedido.desconto)
        valor_final += float(pedido.valor_final)
            
        pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
        pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    total = ("%.2f" % total).replace('.', ',')
    desconto = ("%.2f" % desconto).replace('.', ',')
    valor_final = ("%.2f" % valor_final).replace('.', ',')
    
    header = "Caixa " + str(dia.guiche) + " - " + str(dia)
    return render_to_response('venda/relatorio_pedido.html', locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('relatorio.view_report')
def relatorio_pedido(request, pedido_id):
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id = pedido_id)
    
    return render_to_response('venda/relatorio_pedido_item.html', locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
@permission_required('relatorio.view_report')
def relatorio_periodo(request):
    import datetime
    from django.db.models import Q
    if request.method == 'POST' and request.POST.has_key('inicio') and request.POST.has_key('fim'):
        inicio = request.POST['inicio']
        fim = request.POST['fim']
        
        ini = map(int, inicio.split('/'))
        ini = datetime.date(year = ini[2], month = ini[1], day = ini[0])
        
        fi = map(int, fim.split('/'))
        fi = datetime.date(year = fi[2], month = fi[1], day = fi[0])
        
        caixas = Caixa.objects.filter(~Q(fechado = None), aberto__gt = ini - datetime.timedelta(0), fechado__lte = fi + datetime.timedelta(1))
        
        dinheiro = debito = cartao = cheque = crediario = recebimento = 0.0
        
        for d in caixas:
            dinheiro = dinheiro + float(d.dinheiro)
            debito = debito + float(d.debito)
            cartao = cartao + float(d.cartao)
            cheque = cheque + float(d.cheque)
            crediario = crediario + float(d.crediario)
            recebimento = recebimento + float(d.recebimento)
            
        
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    js = '/venda/relatorio'
    titulo = 'Relatório por período'
    
    return render_to_response('venda/relatorio_periodo.html', locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
def pedido_cliente(request, pedido_id):
    next = None
    if request.GET.has_key('next'):
        next = request.GET['next']
    elif request.POST.has_key('next'):
        next = request.POST['next']
        
    if request.POST.has_key('busca'):
        clientes = None
        q = request.POST['q'].strip()
        
        if len(q) > 0:
            clientes = Cliente.objects.filter(Q(nome__icontains = q) | Q(cpf = q))
            clientes = list(clientes)
            
            telefones = Telefone.objects.filter(numero__icontains = q)
            
            for i in telefones:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
                
            enderecos = Endereco.objects.filter(Q(rua__icontains = q) | Q(cidade__icontains = q) | Q(referencia__icontains = q) | Q(cep__icontains = q))
            for i in enderecos:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
            
            for i in clientes:
                while clientes.count(i) > 1:
                    clientes.remove(i)
            
            for cliente in clientes:
                cliente.telefones = Telefone.objects.filter(cliente_id = cliente.id)
                cliente.enderecos = Endereco.objects.filter(cliente_id = cliente.id)
    
        if clientes == None or len(clientes) == 0:
            request.session['mensagem'] = u'Não encontramos clientes com a busca por \"' + q + '\".'
    
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    js = 'venda/pedido_cliente'
    return render_to_response('venda/pedido_cliente.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_cliente_associar(request, pedido_id, cliente_id):
    next = None
    if request.GET.has_key('next'):
        next = request.GET['next']
    elif request.POST.has_key('next'):
        next = request.POST['next']
    
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if Cliente.objects.filter(id = cliente_id):
            pedido.cliente = Cliente.objects.get(id = cliente_id)
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = 'Cliente associado').save()
            
            if next:
                return HttpResponseRedirect(next)
            else:
                return HttpResponseRedirect('/venda/pedido/' + str(pedido.id))
            
        else:
            request.session['aviso'] = 'Cliente não existe'
            return HttpResponseRedirect('/')
    else:
        request.session['aviso'] = 'Pedido não existe'
        return HttpResponseRedirect('/')

@csrf_exempt
@login_required
def pedido_entrega_confirmar_endereco(request):
    troco = float(request.POST['troco'].replace(',', '.'))
    endereco_id = int(request.POST['endereco_id'])
    
    if endereco_id > 0:
        endereco = Endereco.objects.get(id = endereco_id)
    else:
        endereco = request.POST['endereco']
    
    pedido_id = request.POST['pedido_id']
    
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id=pedido.id)
    
    Evento(usuario = request.user, pedido = pedido, descricao = "Imprimiu Entrega").save()
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
    saida += (str(pedido) + ' ' + str(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(pedido.mesa.setor.destino.colunas) + '\n'
    saida += '-'* pedido.mesa.setor.destino.colunas + '\n'
    saida +=  "    Descricao                      Qt Unit  Total\n"
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + "--".zfill(2).ljust(2) + ' ' + "----".replace('.', ',').ljust(5) +' ' + "----".rjust(6) + '\n'
            else:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.quantidade).zfill(2).ljust(2) + ' ' + str(item.produto.preco_de_venda).replace('.', ',').ljust(5) +' ' + str( item.quantidade * item.produto.preco_de_venda ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(setor.destino.colunas)
    
    saida += ("TOTAL R$ ").rjust(40) + str(pedido.total).rjust(10)
    
    
    if pedido.desconto != '0':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        saida += '\n'
        
#        saida += ('Desconto R$ %.2f' % pedido.desconto).rjust(setor.destino.colunas) + '\n'
        saida += ('Desconto RS '.rjust(40)) + ('%.2f' % pedido.desconto).rjust(10) + '\n'  
#        saida += ('VALOR FINAL R$ %.2f' % total).rjust(setor.destino.colunas)
        
        saida += ('VALOR FINAL R$ ').rjust(40) + ('%.2f' % (total)).rjust(10)
        
    saida += '\n' +  '-' * pedido.mesa.setor.destino.colunas + '\n'
    saida += ('Valor Pago R$ ').rjust(40) + ('%.2f' % (total + troco)).rjust(10) + '\n'
    saida += ('Troco R$ ').rjust(40) + ('%.2f' % (troco)).rjust(10)

    saida += '\n' +  '-' * pedido.mesa.setor.destino.colunas + '\n'
    
    saida += 'Dados do cliente'.center(pedido.mesa.setor.destino.colunas) + '\n'
    
    cliente = None
    if pedido.cliente:
        cliente = Cliente.objects.get(id = pedido.cliente_id)
    
    if cliente:
        saida += cliente.nome.center(pedido.mesa.setor.destino.colunas) + '\n\n'
        
        telefones = Telefone.objects.filter(cliente_id = cliente.id)
        if telefones.count() > 0:
            for telefone in telefones:
                saida += unicode(telefone) + '\n'
            saida += '\n'
    
    saida += unicode(endereco) + '\n'
    
    impressao.views.imprime_caixa(saida, pedido.mesa.setor.destino)
    
    request.session['mensagem'] = 'Pedido impresso'
    return HttpResponseRedirect('/')

@login_required
@csrf_exempt
def pedido_vendedor(request, pedido_id):
    
    if request.POST.has_key('busca'):
        vendedores = None
        q = request.POST['q'].strip()
        
        if len(q) > 0:
            vendedores = Group.objects.get(name = 'Vendedor').user_set.all()
            vendedores = vendedores.filter(Q(username__icontains = q) | Q(first_name__icontains = q) | Q(last_name__icontains = q) | Q(email__icontains = q))
            vendedores = list(vendedores)
            
            for i in vendedores:
                while vendedores.count(i) > 1:
                    vendedores.remove(i)
    
        if vendedores == None or len(vendedores) == 0:
            request.session['mensagem'] = u'Não encontramos vendedores com a busca por \"' + q + '\".'
    
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    js = 'venda/pedido_cliente'
    return render_to_response('venda/pedido_vendedor.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_vendedor_associar(request, pedido_id, vendedor_id):
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if User.objects.filter(id = vendedor_id):
            pedido.vendedor = User.objects.get(id = vendedor_id)
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = 'Cliente associado').save()
            
            return HttpResponseRedirect('/venda/pedido/' + str(pedido.id))
            
        else:
            request.session['aviso'] = 'Cliente não existe'
            return HttpResponseRedirect('/')
    else:
        request.session['aviso'] = 'Pedido não existe'
        return HttpResponseRedirect('/')

# listar produtos separados por categorias
@login_required
def categorias(request, pedido_id):
    lista_categorias = Categoria.objects.all()
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    for categoria in lista_categorias:
        categoria.lista_produtos = Produto.objects.filter(categoria_id = categoria.id)

    js = "venda/produtos"
    css = "venda/produtos"
    return render_to_response('venda/produtos.html', locals(),
        context_instance=RequestContext(request))

@csrf_exempt
@login_required
def adicionar_item(request):
    pedido_id = request.POST['pedido_id']
    produto_id = request.POST['produto_id']
    quantidade = request.POST['quantidade']
    
    pedido_id = int(pedido_id)
    produto_id = int(produto_id)
    
    try:
        produto = Produto.objects.get(id = produto_id)
    except:
        request.session['aviso'] = 'Produto não encontrado'
        return HttpResponseRedirect('/venda/produto/' + str(pedido_id))
    
    """"""
    import re
    if re.match('(^([1-9]+\d*([.,]\d{1,3})?)|(^(0?[.,]\d{1,3})))$', quantidade):
        quantidade = float(quantidade.replace(',', '.'))
        
        if produto.unidade == 'Un' and int(quantidade) != quantidade:
            request.session['aviso'] = 'Quantidade deste produto deve ser valor inteiro'
            return HttpResponseRedirect('/venda/produtos/' + str(pedido_id))
        
        if quantidade > 0:
            pedido = Pedido.objects.get(id = pedido_id, fechado = None)
            
            if float(produto.quantidade) < float(quantidade):
                request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
                return HttpResponseRedirect('/venda/produtos/' + str(pedido_id))
            
            produto.quantidade = float(produto.quantidade) - float(quantidade)
            produto.quantidade_vendida = float(produto.quantidade_vendida) + float(quantidade)
            produto.save()
            
            item = Item(pedido_id = pedido_id, produto_id = produto.id, quantidade = quantidade, valor = produto.preco_de_venda, data = datetime.now())
            item.save()
            
            pedido.total = float(pedido.total) + (float(item.quantidade) * float(item.produto.preco_de_venda))
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = u'Item adicionado').save()
            
            if int(item.quantidade) == 1:
                request.session['mensagem'] = u"Item incluído."
            else:
                request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
                
        else:
            request.session['aviso'] = 'Quantidade inválida'
    else:
        request.session['aviso'] = 'Quantidade inválida'
        
    return HttpResponseRedirect('/venda/produtos/' + str(pedido_id))
    """"""


@login_required
def caixa(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 0:
        request.session['aviso'] = 'Não há caixa aberto'
        return HttpResponseRedirect('/')
    
    if not request.user.has_perm('venda.view_caixa') and not request.user.has_perm('venda.view_entrada') and not request.user.has_perm('venda.adicionar_entrada') and not request.user.has_perm('venda.view_saida') and not request.user.has_perm('venda.adicionar_saida'):
        request.session['aviso'] = 'Você não possui permissão para visualizar caixa'
        return HttpResponseRedirect('../../')
    
    if request.user.has_perm('venda.view_caixa'):
        caixa = Caixa.objects.get(operador = request.user, fechado = None)
        caixa.saldo = float(caixa.valor_recebido - caixa.valor_retirado) + float(caixa.valor_inicial) + float(caixa.dinheiro) + float(caixa.recebimento)
        
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response(
        'venda/caixa.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def entrada(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 0:
        request.session['aviso'] = 'Não há caixa aberto'
        return HttpResponseRedirect('/')
    
    if not request.user.has_perm('venda.view_entrada') and not request.user.has_perm('venda.adicionar_entrada'):
        request.session['aviso'] = 'Você não possui permissão para adicionar ou visualizar entradas'
        return HttpResponseRedirect('../')
    
    caixa = Caixa.objects.get(operador = request.user, fechado = None)
    if request.method == "POST":
        try:
            valor = float(request.POST['valor'].strip().replace(',', '.'))
            if request.POST.has_key('observacao'):
                observacao = request.POST['observacao'].strip()
            else:
                observacao = ''
            
            if valor > 0:
                caixa.valor_recebido = float(caixa.valor_recebido) + float(valor)
                caixa.usuario = request.user
                caixa.save()
                
                Entrada(caixa = caixa, usuario = request.user, valor = valor, observacao = observacao).save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = ('Adicionou R$ %.2f à entrada' % valor).replace('.', ',')).save()
                
                request.session['mensagem'] = ('O valor de R$ %.2f foi registrado' % valor).replace('.', ',')
            else:
                request.session['aviso'] = 'Nenhum valor registrado.'
        except ValueError, e:
            request.session['aviso'] = 'Valor inválido'
    
    js = 'venda/entrada'
    
    if request.user.has_perm('venda.view_entrada'):
        entradas = Entrada.objects.filter(caixa = caixa).order_by('-id')
    
        if not request.GET.has_key('all') or request.GET['all'] != "1":
            entradas = entradas.filter(exibir = True)
        else:
            all = 1
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response(
        'venda/entrada.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def entrada_esconder(request):
    if request.is_ajax() and request.user.has_perm('venda.esconder_entrada'):
        
        if request.POST.has_key('entrada_id'):
    
            entrada_id = int(request.POST['entrada_id'])
            
            if Entrada.objects.filter(id = entrada_id).count() > 0:
                entrada = Entrada.objects.get(id = entrada_id)
                entrada.exibir = False
                entrada.save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = u"Entrada escondida").save()
    
    return HttpResponse(None)

@login_required
def entrada_exibir(request):
    if request.is_ajax() and request.user.has_perm('venda.esconder_entrada'):
        
        if request.POST.has_key('entrada_id'):
    
            entrada_id = int(request.POST['entrada_id'])
            
            if Entrada.objects.filter(id = entrada_id).count() > 0:
                entrada = Entrada.objects.get(id = entrada_id)
                entrada.exibir = True
                entrada.save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = u"Entrada exibida").save()
    
    return HttpResponse(None)

@login_required
def saida(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 0:
        request.session['aviso'] = 'Não há caixa aberto'
        return HttpResponseRedirect('/')
    
    if not request.user.has_perm('venda.view_saida') and not request.user.has_perm('venda.adicionar_saida'):
        request.session['aviso'] = 'Você não possui permissão para adicionar ou visualizar saídas'
        return HttpResponseRedirect('../')
    
    caixa = Caixa.objects.get(operador = request.user, fechado = None)
    if request.method == "POST":
        try:
            valor = float(request.POST['valor'].strip().replace(',', '.'))
            if request.POST.has_key('observacao'):
                observacao = request.POST['observacao'].strip()
            else:
                observacao = ''
            
            if valor > 0:
                caixa.valor_retirado = float(caixa.valor_retirado) + float(valor)
                caixa.usuario = request.user
                caixa.save()
                
                Saida(caixa = caixa, usuario = request.user, valor = valor, observacao = observacao).save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = ('Adicionou R$ %.2f à saída' % valor).replace('.', ',')).save()
                
                request.session['mensagem'] = ('O valor de R$ %.2f foi registrado' % valor).replace('.', ',')
            else:
                request.session['aviso'] = 'Nenhum valor registrado.'
        except ValueError, e:
            request.session['aviso'] = 'Valor inválido'
    
    js = 'venda/saida'
    
    if request.user.has_perm('venda.view_saida'):
        saidas = Saida.objects.filter(caixa = caixa).order_by('-id')
    
        if not request.GET.has_key('all') or request.GET['all'] != "1":
            saidas = saidas.filter(exibir = True)
        else:
            all = 1
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response(
        'venda/saida.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def saida_esconder(request):
    if request.is_ajax() and request.user.has_perm('venda.esconder_saida'):
        
        if request.POST.has_key('saida_id'):
    
            saida_id = int(request.POST['saida_id'])
            
            if Saida.objects.filter(id = saida_id).count() > 0:
                saida = Saida.objects.get(id = saida_id)
                saida.exibir = False
                saida.save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = u"Saída escondida").save()
    
    return HttpResponse(None)

@login_required
def saida_exibir(request):
    if request.is_ajax() and request.user.has_perm('venda.esconder_saida'):
        
        if request.POST.has_key('saida_id'):
    
            saida_id = int(request.POST['saida_id'])
            
            if Saida.objects.filter(id = saida_id).count() > 0:
                saida = Saida.objects.get(id = saida_id)
                saida.exibir = True
                saida.save()
                
                Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = u"Saída exibida").save()
    
    return HttpResponse(None)

@login_required
def devolucao(request):
    if Caixa.objects.filter(operador = request.user, fechado = None).count() == 0:
        request.session['aviso'] = 'Não há caixa aberto'
        return HttpResponseRedirect('/')
    
    if not request.user.has_perm('venda.fazer_devolucao'):
        request.session['aviso'] = 'Você não possui permissão para fazer devolução'
        return HttpResponseRedirect('../../')
    
    if request.method == "POST":
        try:
            pedido_id = int(request.POST['pedido_id'].strip())
            produto_id = request.POST['produto_id'].strip()
            quantidade = float(request.POST['quantidade'].strip().replace(',', '.'))
            cliente_id = int(request.POST['cliente_id'].strip())
            valor = float(request.POST['valor'].strip().replace(',', '.'))
            tipo = request.POST.getlist('tipo')
            
            if 'on' in tipo:
                tipo = True
            else:
                tipo = False
            
            motivo = request.POST['motivo'].strip()
            
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(id = pedido_id)
            else:
                request.session['mensagem'] = 'Pedido não existe'
                pedido = None
                
            if Produto.objects.filter(codigo = produto_id).count() == 1:
                produto = Produto.objects.get(codigo = produto_id)
                
                if cliente_id > 0:
                    cliente = Cliente.objects.get(id = cliente_id)
                    
                    if motivo != '':
                        if quantidade > 0:
                            if round(quantidade, 2) <= round(float(produto.quantidade_vendida), 2):
                                caixa = Caixa.objects.get(usuario = request.user, fechado = None)
                                Devolucao(pedido = pedido, produto = produto, cliente = cliente, valor = valor, tipo = tipo, motivo = motivo).save()
                                
                                if tipo:
                                    caixa.dinheiro = float(caixa.dinheiro) - float(valor)
                                    if float(caixa.dinheiro) + float(caixa.valor_inicial) < 0:
                                        request.session['aviso'] = 'O caixa pode ter ficado com saldo negativo'
                                    caixa.save()
                                
                                produto.quantidade = float(produto.quantidade) + float(quantidade)
                                produto.quantidade_vendida = float(produto.quantidade_vendida) - float(quantidade)
                                produto.save()
                                
                                Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Devolução de produto").save()
                                
                                request.session['mensagem'] = 'Devolução concluída. Oriente o seu cliente para utilizar um crédito para a nova compra'
                                return HttpResponseRedirect('../../')
                            else:
                                request.session['aviso'] = 'Quantidade maior de que a quantidade vendida'
                        else:
                            request.session['aviso'] = 'Quantidade inválida'
                            
                    else:
                        request.session['aviso'] = 'Informe o motivo da devolução'
                    
                else:
                    request.session['aviso'] = 'Selecione um usuário'
            else:
                request.session['aviso'] = 'Produto inválido'
                    
            
        except ValueError, e:
            print e
            request.session['aviso'] = 'Valores inválidos'
    
    clientes = Cliente.objects.all()
    produtos = Produto.objects.all()
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response(
        'venda/devolucao.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
@permission_required('estoque.adicionar_valor')
def adicionar_valor(request):
    if request.method == "POST":
        pedido_id = int(request.POST['pedido_id'])
        try:
            pedido = Pedido.objects.get(id = pedido_id)
        except:
            return HttpResponseRedirect('/')
        
        try:
            valor = float(request.POST['valor'].strip().replace(',', '.'))
        except:
            request.session['aviso'] = 'Valor inválido'
            return HttpResponseRedirect('/venda/produtos/' + str(pedido_id) + '/')
        
        if Setor.objects.filter(nome_setor = 'Caixa').count() == 1:
            setor = Setor.objects.get(nome_setor = 'Caixa')
        else:
            setor = Setor(nome_setor = 'Caixa')
            setor.save()
        
        if Categoria.objects.filter(nome_categoria = 'Valor').count() == 1:
            categoria = Categoria.objects.get(nome_categoria = 'Valor')
        else:
            categoria = Categoria(nome_categoria = 'Valor')
            categoria.save()
        
        if Produto.objects.filter(setor = setor, categoria = categoria, preco_de_venda = valor).count() == 1:
            produto = Produto.objects.get(setor = setor, categoria = categoria, preco_de_venda = valor)
        else:
            descricao = "R$ " + ("%.2f" % valor).replace('.', ',')
            produto = Produto(descricao = descricao, descricao_impressao = descricao, preco_de_venda = valor, setor = setor, categoria = categoria, codigo = ("%.2f" % valor).replace(".", ","))
            produto.save()
        
        item = Item(pedido = pedido, produto = produto, quantidade = 1, valor = produto.preco_de_venda, data = datetime.now(), estado = 1)
        item.save()
        
        pedido.total = float(pedido.total) + float(item.quantidade) * float(item.produto.preco_de_venda)
        pedido.save()
        
        return HttpResponseRedirect('/venda/pedido/'+ str(pedido_id) + '/')
    else:
        return HttpResponseRedirect('/')